/**
 * @param {number[]} nums
 * @return {number}
 */
// 动态规划要考虑到的问题：当前最优解，并不一定是前面最优解得到的
// 而这道题目刚好是这种情况：这也是与最大子序列和不一样的地方
var maxProduct = function(nums) {
   let max = nums[0], cmax = 1, cmin = 1
   for(let i = 0; i < nums.length; i++) {
    // 因为有正负数，当遇到负数的时候，当前最大值和最小值需要进行调换
    // 也正是因为有负数，所以不仅需要记录当前最大值，还需要记录当前最小值
    if(nums[i] < 0) {
        let temp = cmax
        cmax = cmin
        cmin = temp
    }
    cmax = Math.max(cmax * nums[i], nums[i])
    cmin = Math.min(cmin * nums[i], nums[i])
    max = Math.max(cmax, max)
   }
   return max
};
console.log(maxProduct([2,3,-2,4]));
console.log(maxProduct([-2,0,-1]));
console.log(maxProduct([3,-1,4]));